ソフトウェアアーキテクチャの基礎輪読会 8章
日付:11/12
章:8章
調査者:takasshii.icon
要約
コンポーネントの粒度を適切に設定することがアーキテクトの仕事
まず技術 or ドメインで分けるのかを決める最上位分割を行う コンポーネントとは?
モジュールが集まったコンポーネント単位でアーキテクチャを考えるのが一般的 コンポーネントには様々なものがある
モジュールにラッパーを加えたライブラリ
サブレイヤーやレイヤー
イベントプロセッサー
サービス
コンポーネントのコード量はアーキテクチャによって様々
アーキテクチャの最上位コンポーネントをどう分割するかを決める必要がある
アーキテクトの仕事
アーキテクトはコンポーネントを定義、改良、管理、統制
コンポーネントはアーキテクチャが関わるソフトウェアシステムの構成要素のうち、最も小さい要素
アーキテクチャが決まったらクラスや関数はテックリードや開発者が行う
アーキテクトが上から下まで全てを決定するのは避けた方が良い
コンポーネントの作成
コンポーネントをどのように作成するか
コンポーネントはコンテナ化の仕組み
コンポーネントを使うことで必要な種類の分割を行える分割法にはいろんな種類がある
これがアーキテクチャスタイル
コンポーネントの最上位分割
レイヤードアーキテクチャ(技術)
技術による最上位分割
これを取り入れたMVCモデルはよく使われる
実際の事案はドメイン毎に行われるので、対応範囲が広くなる
モジュラーモノリス(ドメイン)
ドメイン駆動設計が元になる
ドメインを最上位にして分割を行う
ドメインで分けるメリデメ
メリット
ビジネス機能に近い形でモデル化
メッセージフローが問題領域と一致
分散アーキテクチャへの移行が用意
デメリット
特定の処理を行うコードが複数の箇所に現れる
技術で分けるメリデメ
メリット
特定の処理を行うコードが明確に分離
デメリット
CommonやUtilとかのコンポーネントに変更を加えると、他のコンポーネントに影響を与える
ドメインの概念を複製する必要がある
データレベルの結合度が高くなるため、分散システムに移行するのが難しい 開発者の役割
開発者はアーキテクチャが完璧なものと捉えてはいけない
イテレーション
図
初期コンポーネントを識別する
コンポーネントに要件を割り当てる
ロールや責務を分析する
アーキテクチャ特性を分析する
コンポーネントを再構成する
コンポーネントの素粒度
粒度が細かすぎる→たくさんのやり取りが必要になる
粒度が荒すぎる→内部結合の度合いを高めてしまう
デプロイ容易性やテスト容易性の確保を困難に
DBのORMを作るだけ
チームに何も指針を与えない
適切な粒度にするためのアプローチ
アクター/アクションアプローチ
要件とコンポーネントをマッピングするのに使う一般的な方法
アクター
アクティビティを実行するアクター
アクション
アクターが実行するもの
イベントストリーミング
メッセージやイベントを使ってコンポーネント間で通信を行う
イベントを検討し、メッセージやイベントを中心にコンポーネントを構築
分散アーキテクチャで役立つ
ワークフローアプローチ
イベントストリーミングと似ているが、イベントやメッセージという制約はないもの
主要なロールを明らかにし、それらのロールが従事するワークフローの種類を決定、識別されたアクティビティを中心にコンポーネントを構築する
takasshii.iconアクターとロールって何が違うんだ?
各アプローチはトレードオフ
ウォーターフォールだとアクター/アクションアプローチが好まれる
DDDとかマイクロサービスだとイベントストリーミング
アクター/アクションアプローチの例
アクターとアクションを見つける
ロール
入札者、競売人、システム
システムは内部アクション向けのアクター
アクション
入札者
配信中の動画ストリームを見る
開催中の入札ストリームを見る
入札する
競売人
開催中の入札システムに入力すする
入札をオンラインで受ける
商品を販売済にする
システム
オークションを開始する
決済を行う
入札者のアクティビティを追跡する
アーキテクチャ特性を当てはめる
アーキテクチャ特性を分析する
要件を当てはめる
さらに多くの要件を取り入れ、反復することで粒度を適切にする
コンポーネント設計を終えた後
アーキテクチャががモノシリックか分散型かを決める
モノシリック
レイヤード
モジュラーモノリス
分散アーキテクチャ
ネットワークプロトコルを介して通信する
モノシリックか分散型かはーキテクトが発見したアーキテクト量子の数によって決定される 量子の数が1個なら、モノリスアーキテクチャは大きな利点をもたらす
コンポーネント毎に違うアーキテクチャ特性に対応するなら、分散アーキテクチャも必要となる
応用
code:sample.kt
質疑応答